#include "publishinfomw.h"
#include "ui_publishinfomw.h"

publishinfoMW::publishinfoMW(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::publishinfoMW),
    informationList()
{
    ui->setupUi(this);
    mainWindowInit();
}

publishinfoMW::~publishinfoMW()
{
    delete ui;

}

//自定义软键盘
void publishinfoMW::mainWindowInit()
{
    //this->setWindowFlags(Qt::FramelessWindowHint); // 设置无边框
    ui->centralwidget->installEventFilter(this);   // 安装事件过滤器

    eInput = new easyInput(this);      //输入法实例化
    eInput->installEventFilter(this);  //安装事件过滤器
    inputFlag = true;
    ui->centralwidget->setFocus();   // 界面初始化时，先把焦点在menu处，否则输入法会先出现
}

bool publishinfoMW::eventFilter(QObject *watched, QEvent *event)
{
    if(watched == ui->centralwidget){
        static QPoint point;
        switch (event->type()) {
        case QEvent::MouseButtonPress:
            point.setY(cursor().pos().y());     // 记录按下点的y坐标
            eInput->hide();
            break;
        default:
            break;
        }
    }
    if(watched == eInput)
        switch (event->type()) {
        case QEvent::Hide:
            break;
        case QEvent::Show:
        {
            if(inputFlag == false){
                eInput->hide();
                return false;
            }
            //ui->textEdit->moveCursor(QTextCursor::End);//自动滑动到最后一行
        }
            break;
        default:
            break;
        }
    return QWidget::eventFilter(watched,event);//将事件传递给父类
}

void publishinfoMW::slotHideInput()
{
    eInput->hide();
}
//置顶信息
void publishinfoMW::on_top_btn_clicked()
{
    QString specifiedInformation = ui->textEdit->toPlainText(); // 获取用户输入的指定信息
    if (specifiedInformation.isEmpty())
    {
        QMessageBox::warning(this, "警告", "没有可置顶的信息！");
        return;
    }

    QFile file("information.txt");
   if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
       QMessageBox::critical(this, "错误", "无法打开文件以置顶内容！");
       return;
   }

   QTextStream in(&file);
   QList<QString> updatedList;
   bool found = false; // 标记是否找到指定信息

   while (!in.atEnd()) {
       QString line = in.readLine();
       if (line == specifiedInformation) {
           found = true; // 找到指定信息
           updatedList.prepend(line); // 将信息置顶
       } else {
           updatedList.append(line); // 保留其他信息
       }
   }

   file.close();

   // 如果未找到指定信息，先发布该信息
   if (!found) {
       if (!file.open(QIODevice::Append | QIODevice::Text)) {
           QMessageBox::critical(this, "错误", "无法打开文件以发布内容！");
           return;
       }
       QTextStream out(&file);
       out << specifiedInformation << "\n";
       file.close();
       updatedList.prepend(specifiedInformation); // 将新发布的信息置顶
       informationList.append(specifiedInformation); // 更新内存中的信息列表
   }

   // 重新写入文件
   if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
       QMessageBox::critical(this, "错误", "无法打开文件以置顶内容！");
       return;
   }

   QTextStream out(&file);
   for (const auto &info : updatedList) {
       out << info << "\n"; // 重新写入信息
   }

   file.close();
   informationList = updatedList; // 更新内存中的信息列表
   QMessageBox::information(this, "提示", "置顶成功！");
}

//撤回信息
void publishinfoMW::on_retract_btn_clicked()
{

    QString specifiedInformation = ui->textEdit->toPlainText(); // 获取用户输入的指定信息
    QFile file("information.txt");
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        QMessageBox::critical(this, "错误", "无法打开文件以撤回内容！");
        return;
    }

    QTextStream in(&file);
    QList<QString> updatedList;
    bool retracted = false; // 标记是否已撤回信息

    while (!in.atEnd()) {
        QString line = in.readLine();
        if (!specifiedInformation.isEmpty() && line == specifiedInformation) {
            retracted = true; // 找到并撤回指定信息
        } else {
            updatedList.append(line); // 保留未撤回的信息
        }
    }

    file.close();

    // 如果输入框为空，默认撤回最后一条信息
    if (specifiedInformation.isEmpty() && !updatedList.isEmpty()) {
        updatedList.removeLast(); // 移除最后一条信息
        retracted = true;
    }

    // 如果有信息被撤回，重新写入文件
    if (retracted) {
        if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
            QMessageBox::critical(this, "错误", "无法打开文件以撤回内容！");
            return;
        }

        QTextStream out(&file);
        for (const auto &info : updatedList) {
            out << info << "\n"; // 重新写入未撤回的信息
        }

        file.close();
        informationList = updatedList; // 更新内存中的信息列表
        QMessageBox::information(this, "提示", "撤回成功！");
    } else {
        QMessageBox::warning(this, "警告", "未找到指定的信息！");
    }
}

//添加信息到文本
void publishinfoMW::on_add_btn_clicked()
{
    QString information = ui->textEdit->toPlainText();
        if (information.isEmpty()) {
            QMessageBox::warning(this, "警告", "请输入要发布的信息！");
            return;
        }

        QFile file("information.txt");
        if (file.open(QIODevice::Append | QIODevice::Text)) {
            QTextStream out(&file);
            out << information << "\n";
            file.close();
            informationList.append(information); // 将信息发布到列表中
            QMessageBox::information(this, "提示", "发布成功！");
        } else {
            QMessageBox::critical(this, "错误", "无法打开文件！");
        }

}

//清空信息文本
void publishinfoMW::on_clear_btn_clicked()
{
    // 清空文本编辑框
    ui->textEdit->clear();

    // 清空文件
    QFile file("information.txt");
      if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
          file.resize(0); // 清空文件内容
          file.close();
          informationList.clear(); // 清空列表
      } else {
          QMessageBox::critical(this, "错误", "无法打开文件以清空内容！");
      }
    QMessageBox::information(this, "提示", "信息已清空！");
}

//返回
void publishinfoMW::on_back_btn_clicked()
{
    //所以可以利用此函数获取当前窗口的父窗口对象指针
    QWidget *parent = this->parentWidget();
    parent->show();//把之前父界面的隐藏状态改为显示状态，显示父界面
    this->close();//关闭当前界面
}

